Estrutura de dados em C -> Fila Circular com operador módulo
Exemplo de implementacao de uma fila circular utilizando o operador módulo (%) para simplificar as coisas. Como vcs podem ver, fica bem simples e eficiente :P
PS: o codigo para download esta melhor organizado e comentado!
PS: o codigo para download esta melhor organizado e comentado!
Descrição
Exemplo de implementacao de uma fila circular utilizando o operador módulo (%) para simplificar as coisas. Como vcs podem ver, fica bem simples e eficiente :P
PS: o codigo para download esta melhor organizado e comentado!
PS: o codigo para download esta melhor organizado e comentado!
Versões atualizadas deste script
#include <stdio.h>
#include <stdlib.h> // comente esta linha se for compilar no linux
#define MAX 4 // numero maximo de elementos na fila
// cria uma fila vazia
int comeco = 0; // comeco da fila
int tamanho = 0; // tamanho da fila (numero de elementos)
int queue[MAX]; // vetor da fila
void inserir( int ); // inserir elementos no fim da fila
void remover( void ); // remover elementos do comeco da fila
int main(void)
{
int i; // contador
inserir(1);
inserir(10);
inserir(100);
inserir(1000);
remover();
inserir(6);
remover();
inserir(60);
//// mostra fila na tela ////
for(i = 0; i < MAX; i++)
printf("fila[%i] = %i\n", i, queue[i]);
// system("pause"); // comente esta linha se for rodar no linux
return ( 0 );
} // fim main
void inserir( int elemento )
{
//// checa se a fila esta cheia ////
if( tamanho == MAX )
printf("\nfila cheia\n");
else {
//// converte os valores virtuais (tamanho e comeco) para o valor real utilizando o operador modulo ////
queue[ ((comeco + tamanho) % MAX) ] = elemento;
//// incrementa tamanho da fila (elemento foi inserido) ////
tamanho ++;
}
} // fim funcao
void remover(void)
{
//// checa se a fila esta vazia ////
if( tamanho == 0 )
printf("\nfila vazia\n");
else {
//// apaga o primeiro elemento da fila deslocando o ponteiro do comeco para proximo elemento ////
comeco ++;
//// decrementa o contador de tamanho (um valor foi removido) ////
tamanho --;
}
} // fim funcao
Com o codigo do jeito que está, caso seja exibido o vetor após a função remover ser executada, o programa irá exibir o vetor com informações incorretas (um ou mais elementos não serão removidos mesmo após ter sido executado a função remover. Estes elementos apenas serao sobreescritos caso executemos a funcao inserir até a fila ficar cheia, por isto o print deste codigo exibe corretamente o final do vetor, mais caso seja feito o teste de mesa será identificado o seu erro.)
a correcao é simples, uma linha será adicionada na funcao remover:
void remover(void)
{
// checa se a fila esta vazia
if( tamanho == 0 )
printf("\nfila vazia\n");
else {
// (LINHA QUE FOI ADICIONADA) apaga o primeiro elemento da fila
queue[comeco] = 0;
// indica que a fila comeca em uma posicao a mais
comeco ++;
// decrementa o contador de tamanho de elementos
tamanho --;
}
Seria interessante também fazer uma função chamada mostrafila, para que seja mais facil vizualizar a inserção e remoção de elementos.
Enfim, a logica do código é muito boa, e o mesmo está extremamente bem comentado. Devo parabenizálo pois vai ser muito util para quem está ingressando nos estudos. As resalvas feitas são apenas para melhorar o entendimento dos estudantes que acessarem este exemplo. Outra dica é, Use e Abuse de funções, neste exemplo uma função mostrafila se faz mais do que necessário.